package com.example.OnlineStorage.util;

import com.example.OnlineStorage.enums.GlobalVariables_String;
import com.example.OnlineStorage.enums.ImageType;
import com.example.OnlineStorage.enums.VideoType;
import com.example.OnlineStorage.pojo.entity.User;
import org.springframework.stereotype.Component;

import java.util.Objects;

/**
 * 验证类，提供各种验证功能。
 * 包括令牌验证、密码更新验证和文件类型验证。
 */
@Component
public class Verify {

    /**
     * 验证令牌是否存在。
     *
     * @param token 待验证的令牌字符串。
     * @return 如果令牌存在返回true，否则返回false。
     */
    public static boolean VerifyToken(String token) {
        return Redis.EXISTS(token);
    }

    /**
     * 验证用户密码更新的合法性。
     *
     * @param oldPassword  用户旧密码。
     * @param newPassword  用户新密码。
     * @param newPassword2 用户再次输入的新密码，用于确认。
     * @param user         当前用户对象。
     * @throws RuntimeException 如果旧密码错误或两次输入的新密码不一致，抛出运行时异常。
     */
    public static void VerifyUpdatePassword(String oldPassword, String newPassword, String newPassword2, User user) {
        String password = user.getPassword();
        try {
            if (!oldPassword.equals(password)) {
                throw new Exception("旧密码错误");
            }
            if (!newPassword.equals(newPassword2)) {
                throw new Exception("两次新密码不一致");
            }
        } catch (Exception ex) {
            throw new RuntimeException(ex.getMessage());
        }
    }
    /**
     * 验证注册用户信息
     *
     * @param user 要验证的用户对象
     */
    public static void VerifyRegisterUser(User user) {
        if(user.getUsername().length() < 3 || user.getUsername().length() > 255){
            throw new RuntimeException("用户名长度必须在3到255个字符之间");
        }
        if(user.getPassword().length() < 8 || user.getPassword().length() > 255){
            throw new RuntimeException("密码长度必须在8到255个字符之间");
        }
        if(! Objects.equals(user.getEmail(), "")){
            if(!user.getEmail().matches("^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$")){
                throw new RuntimeException("邮箱格式错误");
            }
        }

    }



    /**
     * 验证文件类型是否为允许的图片类型。
     *
     * @param type 待验证的文件类型字符串。
     * @return 如果文件类型合法返回true，否则返回false。
     */
    public static boolean VerifyFileType_Image(String type) {
        for (ImageType ImageType : ImageType.values()) {
            if (type.equals(ImageType.getValue())) {
                return true;
            }
        }
        return false;
    }
    /**
     * 验证文件类型是否为允许的视频类型。
     *
     * @param type 待验证的文件类型字符串。
     * @return 如果文件类型合法返回true，否则返回false。
     */
    public static boolean VerifyFileType_Video(String type){
        for (VideoType VideoType : VideoType.values()) {
            if (type.equals(VideoType.getValue())) {
                return true;
            }
        }
        return false;
    }

    /**
     * 验证要上传的文件是否存在于资源文件夹中
     *
     * @param fileSHA256 要验证的文件哈希值
     * @return 如果文件存在返回true，否则返回false。
     */
    public static boolean VerifyFileIsExistCourseResource(String fileSHA256) {
       
        return IO.isFileExist(GlobalVariables_String.File_Path_Files.getValue() + fileSHA256);
    }
	
	
}
